﻿namespace StockSharp.Algo.Indicators.Oscillator
{
	using System;
	using System.Collections.Generic;

	using StockSharp.Algo.Candles;

	/// <summary>
	/// Средневзвешанная часть индикатора <see cref="RelativeVigorIndex"/>.
	/// </summary>
	public class RelativeVigorIndexAverage : LengthIndicator<decimal>
	{
		private readonly List<Candle> _buffer = new List<Candle>();

		/// <summary>
		/// Создать <see cref="RelativeVigorIndexAverage"/>.
		/// </summary>
		public RelativeVigorIndexAverage()
			: base(typeof(Candle))
		{
			base.Length = 4;
		}

		/// <summary>
		/// Длина периода.
		/// </summary>
		public override int Length
		{
			set
			{
				throw new NotSupportedException("Изменение длины не поддерживается данным индикатором.");
			}
		}

		/// <summary>
		/// Сбросить состояние индикатора на первоначальное. Метод вызывается каждый раз, когда меняются первоначальные настройки (например, длина периода).
		/// </summary>
		public override void Reset()
		{
			base.Reset();
			_buffer.Clear();
		}

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			_buffer.Add(input.GetValue<Candle>());

			if (_buffer.Count > Length)
				_buffer.RemoveAt(0);

			if (IsFormed)
			{
				var valueUp = ((_buffer[0].ClosePrice - _buffer[0].OpenPrice) + 2 * (_buffer[1].ClosePrice - _buffer[1].OpenPrice) +
				               2 * (_buffer[2].ClosePrice - _buffer[2].OpenPrice) + (_buffer[3].ClosePrice - _buffer[3].OpenPrice)) / 6m;

				var valueDn = ((_buffer[0].HighPrice - _buffer[0].LowPrice) + 2 * (_buffer[1].HighPrice - _buffer[1].LowPrice) +
				               2 * (_buffer[2].HighPrice - _buffer[2].LowPrice) + (_buffer[3].HighPrice - _buffer[3].LowPrice)) / 6m;

				var value = valueDn == decimal.Zero ? valueUp : valueUp / valueDn;

				return value;
			}
			else
				return 0;
		}
	}
}